package jmine.tec.persist.hibernate.proxy;


/** 
 * Especifica que um objeto é uma proxy que guarda um objeto "lazy". <br>
 * Esta proxy é serializável e nunca perde a sessão do hibernate. 
 * 
 * @param <T> tipo do objeto lazy
 * @author wellington.santos
 * @created May 30, 2012
 */
public interface SerializableLazyProxy<T> {

    /**
     * Obtém o objeto "lazy" encapsulado.
     * 
     * @return o objeto "lazy"
     */
    T getLazyObject();

    /**
     * Obtém o objeto real carregado (não lazy). <br>
     * A chamada a este método irá forcar o carregamento.
     * 
     * @return o objeto real carregado (não lazy)
     */
    Object getImplementation();

    /**
     * Verifica se o objeto "lazy" já foi inicializado.
     * 
     * @return True se o objeto ainda não foi carregado
     */
    boolean isUninitialized();
    
    /**
     * Obtém a instância a ser serializada. <br>
     * Se o objeto "lazy" já foi carregado irá retornar o mesmo resultado que {@link #getImplementation()}. <br>
     * Caso contrário será retornado uma referência que saberá como recuperar a sessão após deserializar.
     * 
     * @return a instância a ser serializada 
     */
    Object writeReplace();
    
}
